﻿namespace Service.Framework.Utils
{
    public static class ObjectUtil
    {
        //
        // 摘要:
        //     int
        //
        // 参数:
        //   value:
        //
        // 类型参数:
        //   T:
        public static int ToInt32<T>(this T value)
        {
            if (value == null)
            {
                return 0;
            }

            try
            {
                string text = value as string;
                if (text != null)
                {
                    if (string.IsNullOrWhiteSpace(text))
                    {
                        return 0;
                    }

                    if (text.Count((char w) => w == '.') == 1)
                    {
                        text = text.Substring(0, text.IndexOf('.'));
                    }

                    return Convert.ToInt32(text);
                }

                if ((object)value is IConvertible convertible)
                {
                    return convertible.ToInt32(null);
                }
            }
            catch (Exception)
            {
            }

            int.TryParse(value.ToStr(), out var result);
            return result;
        }

        //
        // 摘要:
        //     long
        //
        // 参数:
        //   value:
        //
        // 类型参数:
        //   T:
        public static long ToLong<T>(this T value)
        {
            if (value == null)
            {
                return 0L;
            }

            try
            {
                string text = value as string;
                if (text != null)
                {
                    if (string.IsNullOrWhiteSpace(text))
                    {
                        return 0L;
                    }

                    if (text.Count((char w) => w == '.') == 1)
                    {
                        text = text.Substring(0, text.IndexOf('.'));
                    }

                    return Convert.ToInt64(text);
                }

                if ((object)value is IConvertible convertible)
                {
                    return convertible.ToInt64(null);
                }
            }
            catch (Exception)
            {
            }

            long.TryParse(value.ToStr(), out var result);
            return result;
        }

        //
        // 摘要:
        //     float
        //
        // 参数:
        //   value:
        //
        // 类型参数:
        //   T:
        public static float ToFloat<T>(this T value)
        {
            if (value == null)
            {
                return 0f;
            }

            float result;
            return float.TryParse(value.ToStr(), out result) ? result : 0f;
        }

        //
        // 摘要:
        //     double
        //
        // 参数:
        //   value:
        //
        // 类型参数:
        //   T:
        public static double ToDouble<T>(this T value)
        {
            if (value == null)
            {
                return 0.0;
            }

            double result;
            return double.TryParse(value.ToStr(), out result) ? result : 0.0;
        }

        //
        // 摘要:
        //     decimal
        //
        // 参数:
        //   value:
        //
        // 类型参数:
        //   T:
        public static decimal ToDecimal<T>(this T value)
        {
            if (value == null)
            {
                return 0m;
            }

            decimal result;
            return decimal.TryParse(value.ToStr(), out result) ? result : 0m;
        }

        //
        // 摘要:
        //     Guid
        //
        // 参数:
        //   value:
        //
        // 类型参数:
        //   T:
        public static Guid ToGuid<T>(this T value)
        {
            if (value == null)
            {
                return Guid.Empty;
            }

            Guid result;
            return Guid.TryParse(value.ToStr(), out result) ? result : Guid.Empty;
        }

        //
        // 摘要:
        //     Guid?
        //
        // 参数:
        //   value:
        //
        // 类型参数:
        //   T:
        public static Guid? ToGuidNull<T>(this T value)
        {
            if (value == null)
            {
                return null;
            }

            Guid result;
            return Guid.TryParse(value.ToStr(), out result) ? new Guid?(result) : null;
        }

        //
        // 摘要:
        //     GuidString
        //
        // 参数:
        //   value:
        //
        // 类型参数:
        //   T:
        public static string? ToGuidStr<T>(this T value)
        {
            return value.ToGuid().ToStr();
        }

        //
        // 摘要:
        //     bool
        //
        // 参数:
        //   value:
        //
        // 类型参数:
        //   T:
        public static bool ToBool<T>(this T value)
        {
            if (value == null)
            {
                return false;
            }

            bool result;
            return bool.TryParse(value.ToStr(), out result) && result;
        }

        //
        // 摘要:
        //     byte[]
        //
        // 参数:
        //   value:
        //
        // 类型参数:
        //   T:
        public static byte[]? ToBytes<T>(this T value)
        {
            return (value == null) ? null : (value as byte[]);
        }

        //
        // 摘要:
        //     是否为空
        //
        // 参数:
        //   input:
        public static bool IsNullOrEmpty(this string input)
        {
            if (input == null)
            {
                return true;
            }

            return string.IsNullOrEmpty(input);
        }

        //
        // 摘要:
        //     是否为空
        //
        // 参数:
        //   input:
        public static bool IsNullOrWhiteSpace(this string input)
        {
            if (input == null)
            {
                return true;
            }

            return string.IsNullOrWhiteSpace(input);
        }

        //
        // 摘要:
        //     通过类型获取实例
        //
        // 类型参数:
        //   T:
        public static T CreateInstance<T>() where T : class, new()
        {
            Type typeFromHandle = typeof(T);
            if (typeFromHandle.IsValueType || typeof(T) == typeof(string))
            {
                throw new Exception("Conversion type failed!");
            }

            return (Activator.CreateInstance(typeFromHandle) as T) ?? throw new Exception("Conversion failed！");
        }

        //
        // 摘要:
        //     将 Null 对象转换为 对象的实例
        //
        // 参数:
        //   model:
        //
        // 类型参数:
        //   T:
        public static T NullSafe<T>(this T? model) where T : class, new()
        {
            if (model != null)
            {
                return model;
            }

            return new T();
        }

        //
        // 摘要:
        //     将 Null 对象转换为 对象的实例
        //
        // 参数:
        //   model:
        //
        //   defaultInstance:
        //
        // 类型参数:
        //   T:
        public static T NullSafe<T>(this T? model, T defaultInstance) where T : class, new()
        {
            if (model != null)
            {
                return model;
            }

            return defaultInstance;
        }
    }
}
